﻿2026-05-17T00:51:11.5403740Z ##[group]Run pnpm --filter @rebno/client test:e2e
2026-05-17T00:51:11.5404208Z [36;1mpnpm --filter @rebno/client test:e2e[0m
2026-05-17T00:51:11.6915549Z shell: /usr/bin/bash -e {0}
2026-05-17T00:51:11.6915819Z env:
2026-05-17T00:51:11.6915990Z   SKIP_STAGING_VERIFY: false
2026-05-17T00:51:11.6916203Z   SKIP_PHASE_4_CARRYOVER: 
2026-05-17T00:51:11.6916388Z   SKIP_STAGING_SMOKE: false
2026-05-17T00:51:11.6916618Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-17T00:51:11.6916908Z   STAGING_URL: https://staging.rebno.decidel.com
2026-05-17T00:51:11.6917451Z   STAGING_INVITE_TOKEN: ***
2026-05-17T00:51:11.6917910Z   UAT_ACCOUNT_A: ***
2026-05-17T00:51:11.6918175Z   UAT_PASSWORD_A: ***
2026-05-17T00:51:11.6918411Z   UAT_ACCOUNT_B: ***
2026-05-17T00:51:11.6918660Z   UAT_PASSWORD_B: ***
2026-05-17T00:51:11.6918875Z ##[endgroup]
2026-05-17T00:51:12.0712564Z 
2026-05-17T00:51:12.0713601Z > @rebno/client@0.1.0 test:e2e /home/runner/work/rebno/rebno/apps/client
2026-05-17T00:51:12.0714533Z > playwright test
2026-05-17T00:51:12.0715043Z 
2026-05-17T00:51:13.3316874Z 
2026-05-17T00:51:13.3317726Z Running 39 tests using 1 worker
2026-05-17T00:51:13.3318228Z 
2026-05-17T00:51:21.8336420Z   ✘   1 [chromium] › test/e2e/camera-follow.e2e.test.ts:18:1 › Camera follow: walking toward room edge pans the camera (D-29 mandatory) (7.4s)
2026-05-17T00:51:31.1281101Z   ✘   2 [chromium] › test/e2e/camera-follow.e2e.test.ts:18:1 › Camera follow: walking toward room edge pans the camera (D-29 mandatory) (retry #1) (8.1s)
2026-05-17T00:51:45.1671274Z   ✘   3 [chromium] › test/e2e/cli-08-anim.e2e.test.ts:32:1 › CLI-08 anim — local sprite advances ≥3 distinct frames during 1s KeyD hold (Wave 4 GREEN gate) (12.2s)
2026-05-17T00:51:58.7320254Z   ✘   4 [chromium] › test/e2e/cli-08-anim.e2e.test.ts:32:1 › CLI-08 anim — local sprite advances ≥3 distinct frames during 1s KeyD hold (Wave 4 GREEN gate) (retry #1) (11.9s)
2026-05-17T00:52:05.5842115Z   ✘   5 [chromium] › test/e2e/cli-08-camera.e2e.test.ts:29:1 › CLI-08 camera follow — pressing KeyD for 300ms pans camera scrollX (Wave 4 GREEN gate) (5.9s)
2026-05-17T00:52:12.3863594Z   ✘   6 [chromium] › test/e2e/cli-08-camera.e2e.test.ts:29:1 › CLI-08 camera follow — pressing KeyD for 300ms pans camera scrollX (Wave 4 GREEN gate) (retry #1) (5.9s)
2026-05-17T00:52:20.0658106Z   ✓   7 [chromium] › test/e2e/cli-08-collision-boundary.spec.ts:132:3 › derived collision_polys block south wall (D-62 anti-revert) (7.1s)
2026-05-17T00:52:37.5338029Z   ✘   8 [chromium] › test/e2e/cli-08-collision-boundary.spec.ts:132:3 › derived collision_polys block north wall (D-62 anti-revert) (17.2s)
2026-05-17T00:52:45.3746960Z   ✓   9 [chromium] › test/e2e/cli-08-collision-boundary.spec.ts:132:3 › derived collision_polys block north wall (D-62 anti-revert) (retry #1) (7.2s)
2026-05-17T00:52:52.2111020Z   ✓  10 [chromium] › test/e2e/cli-08-collision-boundary.spec.ts:132:3 › derived collision_polys block west wall (D-62 anti-revert) (6.8s)
2026-05-17T00:52:59.6521026Z   ✓  11 [chromium] › test/e2e/cli-08-collision-boundary.spec.ts:132:3 › derived collision_polys block east wall (D-62 anti-revert) (7.4s)
2026-05-17T00:53:20.6052857Z   ✘  12 [chromium] › test/e2e/cli-08-direction-convergence.spec.ts:70:1 › CLI-08 D-58c — dual-tab direction convergence (REQ-SRV-03 server-authoritative) (20.6s)
2026-05-17T00:53:45.7796721Z   ✓  13 [chromium] › test/e2e/cli-08-direction-convergence.spec.ts:70:1 › CLI-08 D-58c — dual-tab direction convergence (REQ-SRV-03 server-authoritative) (retry #1) (24.3s)
2026-05-17T00:54:15.0165378Z   ✓  14 [chromium] › test/e2e/cli-08-dup-login.e2e.test.ts:19:3 › D-51 dup-login eviction › second session evicts first; second tab reaches GameScene, first tab reaches LoginScene (29.2s)
2026-05-17T00:54:21.9051404Z   ✓  15 [chromium] › test/e2e/cli-08-floor-collision.e2e.test.ts:114:3 › floor tiles render and block south wall (6.8s)
2026-05-17T00:54:28.9001465Z   ✓  16 [chromium] › test/e2e/cli-08-floor-collision.e2e.test.ts:114:3 › floor tiles render and block north wall (7.0s)
2026-05-17T00:54:35.8343505Z   ✓  17 [chromium] › test/e2e/cli-08-floor-collision.e2e.test.ts:114:3 › floor tiles render and block west wall (6.9s)
2026-05-17T00:54:53.0692835Z   ✘  18 [chromium] › test/e2e/cli-08-floor-collision.e2e.test.ts:114:3 › floor tiles render and block east wall (17.0s)
2026-05-17T00:55:00.8722147Z   ✓  19 [chromium] › test/e2e/cli-08-floor-collision.e2e.test.ts:114:3 › floor tiles render and block east wall (retry #1) (7.1s)
2026-05-17T00:55:27.6648721Z   ✘  20 [chromium] › test/e2e/cli-08-ghost-run-disconnect.spec.ts:21:1 › disconnect while moving: observer does not see stale remote cardinal run (24.7s)
2026-05-17T00:55:53.8393043Z   ✓  21 [chromium] › test/e2e/cli-08-ghost-run-disconnect.spec.ts:21:1 › disconnect while moving: observer does not see stale remote cardinal run (retry #1) (25.5s)
2026-05-17T00:56:08.1864315Z   ✘  22 [chromium] › test/e2e/cli-08-local-anim.e2e.test.ts:25:1 › local sprite cycles frames during held-key input (D-41 anti-recurrence gate) (13.2s)
2026-05-17T00:56:23.9386995Z   ✘  23 [chromium] › test/e2e/cli-08-local-anim.e2e.test.ts:25:1 › local sprite cycles frames during held-key input (D-41 anti-recurrence gate) (retry #1) (13.9s)
2026-05-17T00:56:28.1152213Z   ✓  24 [chromium] › test/e2e/cli-08-nameplate-offset.e2e.test.ts:30:1 › nameplate sits above sprite top (D-45) (3.6s)
2026-05-17T00:57:12.4801933Z   ✓  25 [chromium] › test/e2e/cli-08-nameplate-stable.spec.ts:37:3 › CLI-08 D-45d nameplate stability under remote motion › constant-vx walk-right: nameplate_y flip count over 30s ≤ ceiling (Plan 06.4-12 D-45d gate) (44.3s)
2026-05-17T00:57:56.9842986Z   ✓  26 [chromium] › test/e2e/cli-08-nameplate-stable.spec.ts:125:3 › CLI-08 D-45d nameplate stability under remote motion › constant-vx walk-left (KeyA): symmetric stability — flips ≤ ceiling (locks symmetric fix) (44.5s)
2026-05-17T00:58:07.2044790Z   ✓  27 [chromium] › test/e2e/cli-08-nameplate.e2e.test.ts:24:1 › CLI-08 nameplate color — local cyan (#00FFFF), remote white (#FFFFFF) (Wave 4 GREEN gate) (10.2s)
2026-05-17T00:58:12.8649363Z   ✘  28 [chromium] › test/e2e/cli-08-resume-render.spec.ts:30:1 › cli-08-resume-render — CLI-08 resume render — Cookie auto-login: login → reload → GameScene re-renders within 5s + chat works (5.3s)
2026-05-17T00:58:30.8638865Z   ✘  29 [chromium] › test/e2e/cli-08-resume-render.spec.ts:30:1 › cli-08-resume-render — CLI-08 resume render — Cookie auto-login: login → reload → GameScene re-renders within 5s + chat works (retry #1) (17.2s)
2026-05-17T00:58:43.6757785Z   ✓  30 [chromium] › test/e2e/cli-08-snapshot-no-spawn-anim.spec.ts:60:1 › CLI-08 D-55d — B joins after A: B sees A in Stand* (no TeleIn anim for pre-existing remote) (12.2s)
2026-05-17T00:59:10.0770772Z   ✘  31 [chromium] › test/e2e/cli-08-snapshot-no-spawn-anim.spec.ts:138:1 › CLI-08 D-55d — A joined first: A DOES see TeleIn anim when B joins during session (gating preserves new-join semantics) (25.6s)
2026-05-17T00:59:23.6943844Z   ✘  32 [chromium] › test/e2e/cli-08-snapshot-no-spawn-anim.spec.ts:138:1 › CLI-08 D-55d — A joined first: A DOES see TeleIn anim when B joins during session (gating preserves new-join semantics) (retry #1) (12.4s)
2026-05-17T00:59:46.1724515Z   ✘  33 [chromium] › test/e2e/cli-08-tiles.e2e.test.ts:26:1 › CLI-08 tiles — RoomRenderer emits floor tiles + TSide1 sides (Wave 4 GREEN gate) (20.4s)
2026-05-17T01:00:09.3118379Z   ✘  34 [chromium] › test/e2e/cli-08-tiles.e2e.test.ts:26:1 › CLI-08 tiles — RoomRenderer emits floor tiles + TSide1 sides (Wave 4 GREEN gate) (retry #1) (21.1s)
2026-05-17T01:00:14.0385827Z   ✓  35 [chromium] › test/e2e/cli-08-ws-reconnect.e2e.test.ts:31:1 › WS-kill: cached reconnection token survives a transient drop (Round-5 FIX A — no eviction-loop, no force_reset banner) (4.1s)
2026-05-17T01:00:28.7142030Z   ✘  36 [chromium] › test/e2e/cli-08.e2e.test.ts:22:1 › CLI-08 hard milestone — two clients see each other move + chat round-trip + reconnect grace (13.7s)
2026-05-17T01:00:44.9215459Z   ✘  37 [chromium] › test/e2e/cli-08.e2e.test.ts:22:1 › CLI-08 hard milestone — two clients see each other move + chat round-trip + reconnect grace (retry #1) (14.7s)
2026-05-17T01:00:46.8854756Z   ✓  38 [chromium] › test/e2e/login-contrast.e2e.test.ts:64:3 › LoginScene contrast › heading has ≥ 4.5:1 contrast ratio on #0A0E1A background (1.3s)
2026-05-17T01:00:48.0507188Z   ✓  39 [chromium] › test/e2e/login-contrast.e2e.test.ts:72:3 › LoginScene contrast › username label has ≥ 4.5:1 contrast ratio (1.1s)
2026-05-17T01:00:49.2562770Z   ✓  40 [chromium] › test/e2e/login-contrast.e2e.test.ts:78:3 › LoginScene contrast › password label has ≥ 4.5:1 contrast ratio (1.2s)
2026-05-17T01:00:50.3333086Z   ✓  41 [chromium] › test/e2e/login-contrast.e2e.test.ts:84:3 › LoginScene contrast › username input text has ≥ 4.5:1 contrast ratio (1.1s)
2026-05-17T01:00:51.4512286Z   ✓  42 [chromium] › test/e2e/login-contrast.e2e.test.ts:90:3 › LoginScene contrast › password input text has ≥ 4.5:1 contrast ratio (1.1s)
2026-05-17T01:00:52.5643965Z   ✓  43 [chromium] › test/e2e/login-contrast.e2e.test.ts:96:3 › LoginScene contrast › submit CTA button text has ≥ 4.5:1 contrast ratio (1.1s)
2026-05-17T01:00:53.7078259Z   ✓  44 [chromium] › test/e2e/login-contrast.e2e.test.ts:104:3 › LoginScene contrast › focused input border-color is accent #22D3EE (rgb 34,211,238) (1.1s)
2026-05-17T01:01:00.6384108Z   ✘  45 [chromium] › test/e2e/logout.e2e.test.ts:18:3 › Esc menu › Esc opens menu; Logout returns to LoginScene with cleared session cookies (D-34) (6.6s)
2026-05-17T01:01:08.4679832Z   ✘  46 [chromium] › test/e2e/logout.e2e.test.ts:18:3 › Esc menu › Esc opens menu; Logout returns to LoginScene with cleared session cookies (D-34) (retry #1) (6.9s)
2026-05-17T01:01:13.2196081Z   ✓  47 [chromium] › test/e2e/logout.e2e.test.ts:51:3 › Esc menu › canvas click opens menu (D-24 secondary trigger) (4.1s)
2026-05-17T01:01:30.5158643Z   ✘  48 [chromium] › test/e2e/logout.e2e.test.ts:69:3 › Esc menu › Resume closes menu and re-engages movement without navigating (17.1s)
2026-05-17T01:01:35.7635198Z   ✓  49 [chromium] › test/e2e/logout.e2e.test.ts:69:3 › Esc menu › Resume closes menu and re-engages movement without navigating (retry #1) (4.6s)
2026-05-17T01:01:40.7161336Z   ✘  50 [chromium] › test/e2e/sprite-state.e2e.test.ts:16:3 › sprite-state machine (D-35) + nametag (D-27a) › player sprite frame switches to Run<R> on rightward movement, back to Stand on stop (4.6s)
2026-05-17T01:01:46.2530322Z   ✘  51 [chromium] › test/e2e/sprite-state.e2e.test.ts:16:3 › sprite-state machine (D-35) + nametag (D-27a) › player sprite frame switches to Run<R> on rightward movement, back to Stand on stop (retry #1) (4.7s)
2026-05-17T01:02:04.4588247Z   ✘  52 [chromium] › test/e2e/sprite-state.e2e.test.ts:48:3 › sprite-state machine (D-35) + nametag (D-27a) › nameplate DOM mirror is visible for self (count >= 1) (17.4s)
2026-05-17T01:02:08.6130386Z   ✓  53 [chromium] › test/e2e/sprite-state.e2e.test.ts:48:3 › sprite-state machine (D-35) + nametag (D-27a) › nameplate DOM mirror is visible for self (count >= 1) (retry #1) (3.5s)
2026-05-17T01:02:11.9074907Z   ✓  54 [chromium] › test/e2e/sprite-state.e2e.test.ts:61:3 › sprite-state machine (D-35) + nametag (D-27a) › nameplate text content matches logged-in username (3.3s)
2026-05-17T01:02:18.5811211Z   ✓  55 [chromium] › test/e2e/ws-kill-reconnect.e2e.test.ts:16:1 › WS-kill: login → kill WS → SDK reconnects within grace → canvas still truthy + chat round-trips (6.6s)
2026-05-17T01:02:18.6347421Z 
2026-05-17T01:02:18.6353804Z 
2026-05-17T01:02:18.6370147Z   1) [chromium] › test/e2e/camera-follow.e2e.test.ts:18:1 › Camera follow: walking toward room edge pans the camera (D-29 mandatory) 
2026-05-17T01:02:18.6372793Z 
2026-05-17T01:02:18.6373423Z     Error: Camera did not pan: before=(120,160) after=(120,160)
2026-05-17T01:02:18.6373940Z 
2026-05-17T01:02:18.6374676Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThanOrEqual[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6375316Z 
2026-05-17T01:02:18.6375628Z     Expected: >= [32m8[39m
2026-05-17T01:02:18.6376093Z     Received:    [31m0[39m
2026-05-17T01:02:18.6376797Z 
2026-05-17T01:02:18.6377024Z       80 |     cameraDelta,
2026-05-17T01:02:18.6377808Z       81 |     `Camera did not pan: before=(${before.scrollX},${before.scrollY}) after=(${after.scrollX},${after.scrollY})`,
2026-05-17T01:02:18.6378727Z     > 82 |   ).toBeGreaterThanOrEqual(8);
2026-05-17T01:02:18.6379488Z          |     ^
2026-05-17T01:02:18.6379899Z       83 |
2026-05-17T01:02:18.6380578Z       84 |   // 8. Secondary: player moved (position changed on at least one axis).
2026-05-17T01:02:18.6381412Z       85 |   const playerMoved = after.x !== before.x || after.y !== before.y;
2026-05-17T01:02:18.6382333Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/camera-follow.e2e.test.ts:82:5
2026-05-17T01:02:18.6382939Z 
2026-05-17T01:02:18.6383674Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6384835Z     test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium/test-failed-1.png
2026-05-17T01:02:18.6386070Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6386622Z 
2026-05-17T01:02:18.6387280Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6388357Z     test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium/video.webm
2026-05-17T01:02:18.6389721Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6390220Z 
2026-05-17T01:02:18.6390981Z     Error Context: test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium/error-context.md
2026-05-17T01:02:18.6391794Z 
2026-05-17T01:02:18.6392475Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6393598Z     test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium/trace.zip
2026-05-17T01:02:18.6394441Z     Usage:
2026-05-17T01:02:18.6394735Z 
2026-05-17T01:02:18.6395559Z         pnpm exec playwright show-trace test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium/trace.zip
2026-05-17T01:02:18.6396749Z 
2026-05-17T01:02:18.6397398Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6398198Z 
2026-05-17T01:02:18.6398865Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6399656Z 
2026-05-17T01:02:18.6399989Z     Error: Camera did not pan: before=(120,160) after=(120,160)
2026-05-17T01:02:18.6402161Z 
2026-05-17T01:02:18.6403199Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThanOrEqual[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6403847Z 
2026-05-17T01:02:18.6404132Z     Expected: >= [32m8[39m
2026-05-17T01:02:18.6404569Z     Received:    [31m0[39m
2026-05-17T01:02:18.6404866Z 
2026-05-17T01:02:18.6405317Z       80 |     cameraDelta,
2026-05-17T01:02:18.6406082Z       81 |     `Camera did not pan: before=(${before.scrollX},${before.scrollY}) after=(${after.scrollX},${after.scrollY})`,
2026-05-17T01:02:18.6406868Z     > 82 |   ).toBeGreaterThanOrEqual(8);
2026-05-17T01:02:18.6407320Z          |     ^
2026-05-17T01:02:18.6407684Z       83 |
2026-05-17T01:02:18.6408222Z       84 |   // 8. Secondary: player moved (position changed on at least one axis).
2026-05-17T01:02:18.6409215Z       85 |   const playerMoved = after.x !== before.x || after.y !== before.y;
2026-05-17T01:02:18.6410078Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/camera-follow.e2e.test.ts:82:5
2026-05-17T01:02:18.6410633Z 
2026-05-17T01:02:18.6411592Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6412759Z     test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6413986Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6414502Z 
2026-05-17T01:02:18.6415155Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6416218Z     test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium-retry1/video.webm
2026-05-17T01:02:18.6417441Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6417935Z 
2026-05-17T01:02:18.6418716Z     Error Context: test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium-retry1/error-context.md
2026-05-17T01:02:18.6419728Z 
2026-05-17T01:02:18.6420400Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6421530Z     test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium-retry1/trace.zip
2026-05-17T01:02:18.6422380Z     Usage:
2026-05-17T01:02:18.6422668Z 
2026-05-17T01:02:18.6423483Z         pnpm exec playwright show-trace test-results/camera-follow.e2e-Camera-f-1d2af--the-camera-D-29-mandatory--chromium-retry1/trace.zip
2026-05-17T01:02:18.6424593Z 
2026-05-17T01:02:18.6425233Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6425720Z 
2026-05-17T01:02:18.6426675Z   2) [chromium] › test/e2e/cli-08-anim.e2e.test.ts:32:1 › CLI-08 anim — local sprite advances ≥3 distinct frames during 1s KeyD hold (Wave 4 GREEN gate) 
2026-05-17T01:02:18.6427523Z 
2026-05-17T01:02:18.6430508Z     Error: Expected ≥3 distinct frame keys during 1s hold; observed 1 (samples=0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000)
2026-05-17T01:02:18.6433147Z 
2026-05-17T01:02:18.6433931Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThanOrEqual[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6434595Z 
2026-05-17T01:02:18.6434909Z     Expected: >= [32m3[39m
2026-05-17T01:02:18.6435399Z     Received:    [31m1[39m
2026-05-17T01:02:18.6435709Z 
2026-05-17T01:02:18.6435941Z       67 |     unique.size,
2026-05-17T01:02:18.6436889Z       68 |     `Expected ≥3 distinct frame keys during 1s hold; observed ${unique.size} (samples=${samples.join(',')})`,
2026-05-17T01:02:18.6437728Z     > 69 |   ).toBeGreaterThanOrEqual(3);
2026-05-17T01:02:18.6438193Z          |     ^
2026-05-17T01:02:18.6438562Z       70 |
2026-05-17T01:02:18.6439304Z       71 |   // 4. Each observed frame must match a NaviRun* pattern (sanity).
2026-05-17T01:02:18.6440034Z       72 |   for (const f of unique) {
2026-05-17T01:02:18.6440756Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-anim.e2e.test.ts:69:5
2026-05-17T01:02:18.6441326Z 
2026-05-17T01:02:18.6441976Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6443062Z     test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium/test-failed-1.png
2026-05-17T01:02:18.6444203Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6444680Z 
2026-05-17T01:02:18.6445289Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6446361Z     test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium/video.webm
2026-05-17T01:02:18.6447468Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6447935Z 
2026-05-17T01:02:18.6448627Z     Error Context: test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium/error-context.md
2026-05-17T01:02:18.6449487Z 
2026-05-17T01:02:18.6450072Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6451213Z     test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium/trace.zip
2026-05-17T01:02:18.6451948Z     Usage:
2026-05-17T01:02:18.6452191Z 
2026-05-17T01:02:18.6452963Z         pnpm exec playwright show-trace test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium/trace.zip
2026-05-17T01:02:18.6453802Z 
2026-05-17T01:02:18.6454413Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6454896Z 
2026-05-17T01:02:18.6455476Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6455950Z 
2026-05-17T01:02:18.6458689Z     Error: Expected ≥3 distinct frame keys during 1s hold; observed 1 (samples=0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000)
2026-05-17T01:02:18.6461432Z 
2026-05-17T01:02:18.6462191Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThanOrEqual[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6462845Z 
2026-05-17T01:02:18.6463119Z     Expected: >= [32m3[39m
2026-05-17T01:02:18.6463585Z     Received:    [31m1[39m
2026-05-17T01:02:18.6463886Z 
2026-05-17T01:02:18.6464101Z       67 |     unique.size,
2026-05-17T01:02:18.6464981Z       68 |     `Expected ≥3 distinct frame keys during 1s hold; observed ${unique.size} (samples=${samples.join(',')})`,
2026-05-17T01:02:18.6465788Z     > 69 |   ).toBeGreaterThanOrEqual(3);
2026-05-17T01:02:18.6466267Z          |     ^
2026-05-17T01:02:18.6466617Z       70 |
2026-05-17T01:02:18.6467144Z       71 |   // 4. Each observed frame must match a NaviRun* pattern (sanity).
2026-05-17T01:02:18.6467753Z       72 |   for (const f of unique) {
2026-05-17T01:02:18.6468448Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-anim.e2e.test.ts:69:5
2026-05-17T01:02:18.6469178Z 
2026-05-17T01:02:18.6469850Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6471005Z     test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6472195Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6472694Z 
2026-05-17T01:02:18.6473300Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6474391Z     test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium-retry1/video.webm
2026-05-17T01:02:18.6475581Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6476336Z 
2026-05-17T01:02:18.6477084Z     Error Context: test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium-retry1/error-context.md
2026-05-17T01:02:18.6477875Z 
2026-05-17T01:02:18.6478564Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6479886Z     test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6480684Z     Usage:
2026-05-17T01:02:18.6480927Z 
2026-05-17T01:02:18.6481730Z         pnpm exec playwright show-trace test-results/cli-08-anim.e2e-CLI-08-ani-dae11-eyD-hold-Wave-4-GREEN-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6482571Z 
2026-05-17T01:02:18.6483189Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6483912Z 
2026-05-17T01:02:18.6484898Z   3) [chromium] › test/e2e/cli-08-camera.e2e.test.ts:29:1 › CLI-08 camera follow — pressing KeyD for 300ms pans camera scrollX (Wave 4 GREEN gate) 
2026-05-17T01:02:18.6485734Z 
2026-05-17T01:02:18.6486109Z     Error: Camera scrollX did not advance: before=120 after=120
2026-05-17T01:02:18.6486554Z 
2026-05-17T01:02:18.6487219Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThan[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6487819Z 
2026-05-17T01:02:18.6488121Z     Expected: > [32m15[39m
2026-05-17T01:02:18.6488690Z     Received:   [31m0[39m
2026-05-17T01:02:18.6488971Z 
2026-05-17T01:02:18.6489434Z       83 |     (after as number) - (before as number),
2026-05-17T01:02:18.6490090Z       84 |     `Camera scrollX did not advance: before=${before} after=${after}`,
2026-05-17T01:02:18.6490699Z     > 85 |   ).toBeGreaterThan(15);
2026-05-17T01:02:18.6491119Z          |     ^
2026-05-17T01:02:18.6491435Z       86 | });
2026-05-17T01:02:18.6491736Z       87 |
2026-05-17T01:02:18.6492309Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-camera.e2e.test.ts:85:5
2026-05-17T01:02:18.6492806Z 
2026-05-17T01:02:18.6493464Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6494487Z     test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium/test-failed-1.png
2026-05-17T01:02:18.6495619Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6496085Z 
2026-05-17T01:02:18.6496655Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6497641Z     test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium/video.webm
2026-05-17T01:02:18.6498754Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6499411Z 
2026-05-17T01:02:18.6500026Z     Error Context: test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium/error-context.md
2026-05-17T01:02:18.6500863Z 
2026-05-17T01:02:18.6501460Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6502476Z     test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium/trace.zip
2026-05-17T01:02:18.6503185Z     Usage:
2026-05-17T01:02:18.6503407Z 
2026-05-17T01:02:18.6504131Z         pnpm exec playwright show-trace test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium/trace.zip
2026-05-17T01:02:18.6504914Z 
2026-05-17T01:02:18.6505490Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6505955Z 
2026-05-17T01:02:18.6506515Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6507165Z 
2026-05-17T01:02:18.6507499Z     Error: Camera scrollX did not advance: before=120 after=120
2026-05-17T01:02:18.6507914Z 
2026-05-17T01:02:18.6508513Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThan[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6509229Z 
2026-05-17T01:02:18.6509509Z     Expected: > [32m15[39m
2026-05-17T01:02:18.6509965Z     Received:   [31m0[39m
2026-05-17T01:02:18.6510209Z 
2026-05-17T01:02:18.6510474Z       83 |     (after as number) - (before as number),
2026-05-17T01:02:18.6511150Z       84 |     `Camera scrollX did not advance: before=${before} after=${after}`,
2026-05-17T01:02:18.6512970Z     > 85 |   ).toBeGreaterThan(15);
2026-05-17T01:02:18.6513469Z          |     ^
2026-05-17T01:02:18.6513777Z       86 | });
2026-05-17T01:02:18.6514089Z       87 |
2026-05-17T01:02:18.6514715Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-camera.e2e.test.ts:85:5
2026-05-17T01:02:18.6515251Z 
2026-05-17T01:02:18.6515901Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6516995Z     test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6518213Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6518664Z 
2026-05-17T01:02:18.6519563Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6520616Z     test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium-retry1/video.webm
2026-05-17T01:02:18.6521724Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6522185Z 
2026-05-17T01:02:18.6522880Z     Error Context: test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium-retry1/error-context.md
2026-05-17T01:02:18.6523628Z 
2026-05-17T01:02:18.6524209Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6525447Z     test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6526208Z     Usage:
2026-05-17T01:02:18.6526428Z 
2026-05-17T01:02:18.6527193Z         pnpm exec playwright show-trace test-results/cli-08-camera.e2e-CLI-08-c-29d96--scrollX-Wave-4-GREEN-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6528013Z 
2026-05-17T01:02:18.6528584Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6529245Z 
2026-05-17T01:02:18.6530072Z   4) [chromium] › test/e2e/cli-08-local-anim.e2e.test.ts:25:1 › local sprite cycles frames during held-key input (D-41 anti-recurrence gate) 
2026-05-17T01:02:18.6530773Z 
2026-05-17T01:02:18.6534116Z     Error: D-41 regression: expected ≥3 distinct localFrame keys during 1s KeyD hold; observed 1 (samples=[0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000]). Symptom: Stand frame perma-lock — check axisX/axisY wiring in GameScene.update() while-loop.
2026-05-17T01:02:18.6536985Z 
2026-05-17T01:02:18.6537618Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThanOrEqual[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6538207Z 
2026-05-17T01:02:18.6538435Z     Expected: >= [32m3[39m
2026-05-17T01:02:18.6538855Z     Received:    [31m1[39m
2026-05-17T01:02:18.6539280Z 
2026-05-17T01:02:18.6539625Z       83 |       `observed ${unique.size} (samples=[${samples.join(',')}]). ` +
2026-05-17T01:02:18.6540669Z       84 |       `Symptom: Stand frame perma-lock — check axisX/axisY wiring in GameScene.update() while-loop.`,
2026-05-17T01:02:18.6541402Z     > 85 |   ).toBeGreaterThanOrEqual(3);
2026-05-17T01:02:18.6541809Z          |     ^
2026-05-17T01:02:18.6542129Z       86 |
2026-05-17T01:02:18.6542788Z       87 |   // 5. At least one observed frame key must contain 'Run' — confirms we left Stand state.
2026-05-17T01:02:18.6543563Z       88 |   const hasRunFrame = [...unique].some((f) => f.includes('Run'));
2026-05-17T01:02:18.6544405Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-local-anim.e2e.test.ts:85:5
2026-05-17T01:02:18.6544936Z 
2026-05-17T01:02:18.6545513Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6546602Z     test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium/test-failed-1.png
2026-05-17T01:02:18.6547659Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6548105Z 
2026-05-17T01:02:18.6548645Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6549891Z     test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium/video.webm
2026-05-17T01:02:18.6550913Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6551335Z 
2026-05-17T01:02:18.6551969Z     Error Context: test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium/error-context.md
2026-05-17T01:02:18.6552651Z 
2026-05-17T01:02:18.6553220Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6554155Z     test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium/trace.zip
2026-05-17T01:02:18.6554822Z     Usage:
2026-05-17T01:02:18.6555025Z 
2026-05-17T01:02:18.6555712Z         pnpm exec playwright show-trace test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium/trace.zip
2026-05-17T01:02:18.6556616Z 
2026-05-17T01:02:18.6557132Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6557559Z 
2026-05-17T01:02:18.6558075Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6558508Z 
2026-05-17T01:02:18.6562125Z     Error: D-41 regression: expected ≥3 distinct localFrame keys during 1s KeyD hold; observed 1 (samples=[0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000,0000-NaviStandD_000]). Symptom: Stand frame perma-lock — check axisX/axisY wiring in GameScene.update() while-loop.
2026-05-17T01:02:18.6564851Z 
2026-05-17T01:02:18.6565496Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThanOrEqual[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6566059Z 
2026-05-17T01:02:18.6566280Z     Expected: >= [32m3[39m
2026-05-17T01:02:18.6566678Z     Received:    [31m1[39m
2026-05-17T01:02:18.6566928Z 
2026-05-17T01:02:18.6567267Z       83 |       `observed ${unique.size} (samples=[${samples.join(',')}]). ` +
2026-05-17T01:02:18.6568215Z       84 |       `Symptom: Stand frame perma-lock — check axisX/axisY wiring in GameScene.update() while-loop.`,
2026-05-17T01:02:18.6568937Z     > 85 |   ).toBeGreaterThanOrEqual(3);
2026-05-17T01:02:18.6569442Z          |     ^
2026-05-17T01:02:18.6569748Z       86 |
2026-05-17T01:02:18.6570431Z       87 |   // 5. At least one observed frame key must contain 'Run' — confirms we left Stand state.
2026-05-17T01:02:18.6571203Z       88 |   const hasRunFrame = [...unique].some((f) => f.includes('Run'));
2026-05-17T01:02:18.6572019Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-local-anim.e2e.test.ts:85:5
2026-05-17T01:02:18.6572692Z 
2026-05-17T01:02:18.6573261Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6574303Z     test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6575403Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6575827Z 
2026-05-17T01:02:18.6576430Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6577405Z     test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium-retry1/video.webm
2026-05-17T01:02:18.6578456Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6579183Z 
2026-05-17T01:02:18.6579876Z     Error Context: test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium-retry1/error-context.md
2026-05-17T01:02:18.6580625Z 
2026-05-17T01:02:18.6581194Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6582171Z     test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6582878Z     Usage:
2026-05-17T01:02:18.6583078Z 
2026-05-17T01:02:18.6583826Z         pnpm exec playwright show-trace test-results/cli-08-local-anim.e2e-loca-e72c5--D-41-anti-recurrence-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6584594Z 
2026-05-17T01:02:18.6585113Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6585533Z 
2026-05-17T01:02:18.6586661Z   5) [chromium] › test/e2e/cli-08-resume-render.spec.ts:30:1 › cli-08-resume-render — CLI-08 resume render — Cookie auto-login: login → reload → GameScene re-renders within 5s + chat works 
2026-05-17T01:02:18.6587592Z 
2026-05-17T01:02:18.6588216Z     Error: [2mexpect([22m[31mreceived[39m[2m).[22mtoContain[2m([22m[32mexpected[39m[2m) // indexOf[22m
2026-05-17T01:02:18.6588778Z 
2026-05-17T01:02:18.6589150Z     Expected value: [32m"mvp"[39m
2026-05-17T01:02:18.6590147Z     Received array: [31m["atlas-mvp", "28828836-602c-4a3e-9397-921aed2c7d24", "62a02514-dc21-43ac-b990-fc179eda2719"][39m
2026-05-17T01:02:18.6590802Z 
2026-05-17T01:02:18.6590981Z       87 |   );
2026-05-17T01:02:18.6591515Z       88 |   // The 'mvp' atlas is loaded by BootScene on the cookie reload path (06-14).
2026-05-17T01:02:18.6592162Z     > 89 |   expect(loadedTextures).toContain('mvp');
2026-05-17T01:02:18.6592638Z          |                          ^
2026-05-17T01:02:18.6593010Z       90 |
2026-05-17T01:02:18.6593623Z       91 |   // 5. Chat round-trip: send a message and assert the chat line appears.
2026-05-17T01:02:18.6594304Z       92 |   await page.keyboard.press('Enter');
2026-05-17T01:02:18.6595097Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-resume-render.spec.ts:89:26
2026-05-17T01:02:18.6595788Z 
2026-05-17T01:02:18.6596393Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6597433Z     test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium/test-failed-1.png
2026-05-17T01:02:18.6598671Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6599277Z 
2026-05-17T01:02:18.6599858Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6600830Z     test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium/video.webm
2026-05-17T01:02:18.6601892Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6602347Z 
2026-05-17T01:02:18.6603108Z     Error Context: test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium/error-context.md
2026-05-17T01:02:18.6603846Z 
2026-05-17T01:02:18.6604457Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6605436Z     test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium/trace.zip
2026-05-17T01:02:18.6606130Z     Usage:
2026-05-17T01:02:18.6606341Z 
2026-05-17T01:02:18.6607190Z         pnpm exec playwright show-trace test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium/trace.zip
2026-05-17T01:02:18.6608016Z 
2026-05-17T01:02:18.6608530Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6608961Z 
2026-05-17T01:02:18.6609618Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6610275Z 
2026-05-17T01:02:18.6610820Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:18.6611303Z 
2026-05-17T01:02:18.6611590Z     Locator: locator('canvas[data-game-ready="true"]')
2026-05-17T01:02:18.6612050Z     Expected: visible
2026-05-17T01:02:18.6612401Z     Timeout: 15000ms
2026-05-17T01:02:18.6612767Z     Error: element(s) not found
2026-05-17T01:02:18.6613036Z 
2026-05-17T01:02:18.6613214Z     Call log:
2026-05-17T01:02:18.6613731Z     [2m  - Expect "toBeVisible" with timeout 15000ms[22m
2026-05-17T01:02:18.6614337Z     [2m  - waiting for locator('canvas[data-game-ready="true"]')[22m
2026-05-17T01:02:18.6614706Z 
2026-05-17T01:02:18.6614783Z 
2026-05-17T01:02:18.6614967Z        at fixtures.ts:172
2026-05-17T01:02:18.6615209Z 
2026-05-17T01:02:18.6615375Z       170 |  */
2026-05-17T01:02:18.6615884Z       171 | export async function waitForGameReady(page: Page): Promise<void> {
2026-05-17T01:02:18.6616695Z     > 172 |   await expect(page.locator('canvas[data-game-ready="true"]')).toBeVisible({
2026-05-17T01:02:18.6617348Z           |                                                                ^
2026-05-17T01:02:18.6659524Z       173 |     timeout: 15_000,
2026-05-17T01:02:18.6699491Z       174 |   });
2026-05-17T01:02:18.6739446Z       175 | }
2026-05-17T01:02:18.6740126Z         at waitForGameReady (/home/runner/work/rebno/rebno/apps/client/test/e2e/fixtures.ts:172:64)
2026-05-17T01:02:18.6779796Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-resume-render.spec.ts:37:9
2026-05-17T01:02:18.6819219Z 
2026-05-17T01:02:18.6829426Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6830743Z     test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6831912Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6832395Z 
2026-05-17T01:02:18.6832955Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6833991Z     test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium-retry1/video.webm
2026-05-17T01:02:18.6835084Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6835525Z 
2026-05-17T01:02:18.6836241Z     Error Context: test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium-retry1/error-context.md
2026-05-17T01:02:18.6836992Z 
2026-05-17T01:02:18.6837577Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6838596Z     test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium-retry1/trace.zip
2026-05-17T01:02:18.6839434Z     Usage:
2026-05-17T01:02:18.6839627Z 
2026-05-17T01:02:18.6840361Z         pnpm exec playwright show-trace test-results/cli-08-resume-render-cli-0-3a9cd-enders-within-5s-chat-works-chromium-retry1/trace.zip
2026-05-17T01:02:18.6841593Z 
2026-05-17T01:02:18.6842188Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6842645Z 
2026-05-17T01:02:18.6843790Z   6) [chromium] › test/e2e/cli-08-snapshot-no-spawn-anim.spec.ts:138:1 › CLI-08 D-55d — A joined first: A DOES see TeleIn anim when B joins during session (gating preserves new-join semantics) 
2026-05-17T01:02:18.6844724Z 
2026-05-17T01:02:18.6845356Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:18.6845902Z 
2026-05-17T01:02:18.6846225Z     Locator: locator('canvas[data-game-ready="true"]')
2026-05-17T01:02:18.6846737Z     Expected: visible
2026-05-17T01:02:18.6847083Z     Timeout: 15000ms
2026-05-17T01:02:18.6847794Z     Error: element(s) not found
2026-05-17T01:02:18.6848070Z 
2026-05-17T01:02:18.6848257Z     Call log:
2026-05-17T01:02:18.6848752Z     [2m  - Expect "toBeVisible" with timeout 15000ms[22m
2026-05-17T01:02:18.6849984Z     [2m  - waiting for locator('canvas[data-game-ready="true"]')[22m
2026-05-17T01:02:18.6850392Z 
2026-05-17T01:02:18.6850480Z 
2026-05-17T01:02:18.6850694Z        at fixtures.ts:172
2026-05-17T01:02:18.6850994Z 
2026-05-17T01:02:18.6851172Z       170 |  */
2026-05-17T01:02:18.6851721Z       171 | export async function waitForGameReady(page: Page): Promise<void> {
2026-05-17T01:02:18.6852507Z     > 172 |   await expect(page.locator('canvas[data-game-ready="true"]')).toBeVisible({
2026-05-17T01:02:18.6853184Z           |                                                                ^
2026-05-17T01:02:18.6853657Z       173 |     timeout: 15_000,
2026-05-17T01:02:18.6854102Z       174 |   });
2026-05-17T01:02:18.6854540Z       175 | }
2026-05-17T01:02:18.6855193Z         at waitForGameReady (/home/runner/work/rebno/rebno/apps/client/test/e2e/fixtures.ts:172:64)
2026-05-17T01:02:18.6856248Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-snapshot-no-spawn-anim.spec.ts:176:11
2026-05-17T01:02:18.6856907Z 
2026-05-17T01:02:18.6857434Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6858440Z     test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium/test-failed-1.png
2026-05-17T01:02:18.6859746Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6860205Z 
2026-05-17T01:02:18.6860749Z     attachment #2: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6862745Z     test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium/test-failed-2.png
2026-05-17T01:02:18.6864168Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6864608Z 
2026-05-17T01:02:18.6865446Z     Error Context: test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium/error-context.md
2026-05-17T01:02:18.6866178Z 
2026-05-17T01:02:18.6866787Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6867751Z     test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium/trace.zip
2026-05-17T01:02:18.6868478Z     Usage:
2026-05-17T01:02:18.6868701Z 
2026-05-17T01:02:18.6869612Z         pnpm exec playwright show-trace test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium/trace.zip
2026-05-17T01:02:18.6870432Z 
2026-05-17T01:02:18.6871070Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6871507Z 
2026-05-17T01:02:18.6872038Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6872472Z 
2026-05-17T01:02:18.6873670Z     Error: Expected ≥3 firstRemoteFrame samples on A during 800 ms window (telemetry must publish — PlayerRenderer.startTeleportAnim onUpdate AND onSimulationTickRemote both write the field).
2026-05-17T01:02:18.6874835Z 
2026-05-17T01:02:18.6875471Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThanOrEqual[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6876041Z 
2026-05-17T01:02:18.6876260Z     Expected: >= [32m3[39m
2026-05-17T01:02:18.6876729Z     Received:    [31m2[39m
2026-05-17T01:02:18.6876991Z 
2026-05-17T01:02:18.6877510Z       186 |         '(telemetry must publish — PlayerRenderer.startTeleportAnim onUpdate ' +
2026-05-17T01:02:18.6878246Z       187 |         'AND onSimulationTickRemote both write the field).',
2026-05-17T01:02:18.6878792Z     > 188 |     ).toBeGreaterThanOrEqual(3);
2026-05-17T01:02:18.6879354Z           |       ^
2026-05-17T01:02:18.6879943Z       189 |     const teleInSamplesA = samplesA.filter((f) => TELEPORT_FRAME_REGEX.test(f));
2026-05-17T01:02:18.6880598Z       190 |     expect(
2026-05-17T01:02:18.6881053Z       191 |       teleInSamplesA.length,
2026-05-17T01:02:18.6881847Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-snapshot-no-spawn-anim.spec.ts:188:7
2026-05-17T01:02:18.6882470Z 
2026-05-17T01:02:18.6883231Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6884342Z     test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6885560Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6886043Z 
2026-05-17T01:02:18.6886590Z     attachment #2: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6887656Z     test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium-retry1/test-failed-2.png
2026-05-17T01:02:18.6888757Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6889586Z 
2026-05-17T01:02:18.6890320Z     Error Context: test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium-retry1/error-context.md
2026-05-17T01:02:18.6891070Z 
2026-05-17T01:02:18.6891624Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6892631Z     test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium-retry1/trace.zip
2026-05-17T01:02:18.6893431Z     Usage:
2026-05-17T01:02:18.6893665Z 
2026-05-17T01:02:18.6894408Z         pnpm exec playwright show-trace test-results/cli-08-snapshot-no-spawn-a-ece4a-eserves-new-join-semantics--chromium-retry1/trace.zip
2026-05-17T01:02:18.6895194Z 
2026-05-17T01:02:18.6895684Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6896108Z 
2026-05-17T01:02:18.6896896Z   7) [chromium] › test/e2e/cli-08-tiles.e2e.test.ts:26:1 › CLI-08 tiles — RoomRenderer emits floor tiles + TSide1 sides (Wave 4 GREEN gate) 
2026-05-17T01:02:18.6897798Z 
2026-05-17T01:02:18.6898356Z     Error: RoomRenderer.renderNew must emit floor tile sprites for mvp-room (D-40 verify-bail flip / Plan 06.1-05)
2026-05-17T01:02:18.6899088Z 
2026-05-17T01:02:18.6899658Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThan[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6900185Z 
2026-05-17T01:02:18.6900408Z     Expected: > [32m0[39m
2026-05-17T01:02:18.6900859Z     Received:   [31m0[39m
2026-05-17T01:02:18.6901134Z 
2026-05-17T01:02:18.6901338Z     Call Log:
2026-05-17T01:02:18.6901843Z     - Timeout 15000ms exceeded while waiting on the predicate
2026-05-17T01:02:18.6902230Z 
2026-05-17T01:02:18.6902672Z       55 |   //    once RoomRenderer.renderNew (Plan 06.1-05) has placed at least one tile
2026-05-17T01:02:18.6903461Z       56 |   //    via group.add(). mvp-room ships 324 tiles, so any positive count clears.
2026-05-17T01:02:18.6904042Z     > 57 |   await expect
2026-05-17T01:02:18.6904387Z          |   ^
2026-05-17T01:02:18.6904703Z       58 |     .poll(
2026-05-17T01:02:18.6905044Z       59 |       async () =>
2026-05-17T01:02:18.6905499Z       60 |         page.evaluate(
2026-05-17T01:02:18.6906164Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-tiles.e2e.test.ts:57:3
2026-05-17T01:02:18.6906668Z 
2026-05-17T01:02:18.6907228Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6908221Z     test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium/test-failed-1.png
2026-05-17T01:02:18.6909419Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6909885Z 
2026-05-17T01:02:18.6910427Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6911507Z     test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium/video.webm
2026-05-17T01:02:18.6912632Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6913068Z 
2026-05-17T01:02:18.6913735Z     Error Context: test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium/error-context.md
2026-05-17T01:02:18.6914423Z 
2026-05-17T01:02:18.6914994Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6915945Z     test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium/trace.zip
2026-05-17T01:02:18.6916641Z     Usage:
2026-05-17T01:02:18.6916850Z 
2026-05-17T01:02:18.6917579Z         pnpm exec playwright show-trace test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium/trace.zip
2026-05-17T01:02:18.6918351Z 
2026-05-17T01:02:18.6918854Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6919416Z 
2026-05-17T01:02:18.6919909Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6920595Z 
2026-05-17T01:02:18.6921169Z     Error: RoomRenderer.renderNew must emit floor tile sprites for mvp-room (D-40 verify-bail flip / Plan 06.1-05)
2026-05-17T01:02:18.6921841Z 
2026-05-17T01:02:18.6922383Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThan[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6922917Z 
2026-05-17T01:02:18.6923143Z     Expected: > [32m0[39m
2026-05-17T01:02:18.6923546Z     Received:   [31m0[39m
2026-05-17T01:02:18.6923799Z 
2026-05-17T01:02:18.6923970Z     Call Log:
2026-05-17T01:02:18.6924418Z     - Timeout 15000ms exceeded while waiting on the predicate
2026-05-17T01:02:18.6924801Z 
2026-05-17T01:02:18.6925211Z       55 |   //    once RoomRenderer.renderNew (Plan 06.1-05) has placed at least one tile
2026-05-17T01:02:18.6926024Z       56 |   //    via group.add(). mvp-room ships 324 tiles, so any positive count clears.
2026-05-17T01:02:18.6926593Z     > 57 |   await expect
2026-05-17T01:02:18.6926930Z          |   ^
2026-05-17T01:02:18.6927239Z       58 |     .poll(
2026-05-17T01:02:18.6927569Z       59 |       async () =>
2026-05-17T01:02:18.6927962Z       60 |         page.evaluate(
2026-05-17T01:02:18.6928599Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-tiles.e2e.test.ts:57:3
2026-05-17T01:02:18.6929222Z 
2026-05-17T01:02:18.6929791Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6930844Z     test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6931953Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6932376Z 
2026-05-17T01:02:18.6932925Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6934041Z     test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium-retry1/video.webm
2026-05-17T01:02:18.6935125Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6935554Z 
2026-05-17T01:02:18.6936228Z     Error Context: test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium-retry1/error-context.md
2026-05-17T01:02:18.6936883Z 
2026-05-17T01:02:18.6937452Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6938435Z     test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6939268Z     Usage:
2026-05-17T01:02:18.6939464Z 
2026-05-17T01:02:18.6940221Z         pnpm exec playwright show-trace test-results/cli-08-tiles.e2e-CLI-08-ti-2c8e9-e1-sides-Wave-4-GREEN-gate--chromium-retry1/trace.zip
2026-05-17T01:02:18.6941013Z 
2026-05-17T01:02:18.6941641Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6942209Z 
2026-05-17T01:02:18.6943023Z   8) [chromium] › test/e2e/cli-08.e2e.test.ts:22:1 › CLI-08 hard milestone — two clients see each other move + chat round-trip + reconnect grace 
2026-05-17T01:02:18.6943719Z 
2026-05-17T01:02:18.6944309Z     Error: [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThan[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6944856Z 
2026-05-17T01:02:18.6945078Z     Expected: > [32m470[39m
2026-05-17T01:02:18.6945481Z     Received:   [31m440[39m
2026-05-17T01:02:18.6945730Z 
2026-05-17T01:02:18.6945978Z       78 |       .getAttribute('data-x-coord');
2026-05-17T01:02:18.6946475Z       79 |     const afterX = Number(afterXStr ?? '0');
2026-05-17T01:02:18.6947263Z     > 80 |     expect(afterX).toBeGreaterThan(beforeX + 30); // ≥30 px movement; conservative.
2026-05-17T01:02:18.6947900Z          |                    ^
2026-05-17T01:02:18.6948243Z       81 |
2026-05-17T01:02:18.6948781Z       82 |     // (4) Chat round-trip. A presses Enter to focus chat, types, Enter to send.
2026-05-17T01:02:18.6949613Z       83 |     //     B sees a `.chat-line` matching `<sender>: <text>` within 5s.
2026-05-17T01:02:18.6950354Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08.e2e.test.ts:80:20
2026-05-17T01:02:18.6950827Z 
2026-05-17T01:02:18.6951403Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6952405Z     test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium/test-failed-1.png
2026-05-17T01:02:18.6953460Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6953885Z 
2026-05-17T01:02:18.6954438Z     attachment #2: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6955549Z     test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium/test-failed-2.png
2026-05-17T01:02:18.6956613Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6957038Z 
2026-05-17T01:02:18.6957665Z     Error Context: test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium/error-context.md
2026-05-17T01:02:18.6958332Z 
2026-05-17T01:02:18.6958895Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6959949Z     test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium/trace.zip
2026-05-17T01:02:18.6960666Z     Usage:
2026-05-17T01:02:18.6960864Z 
2026-05-17T01:02:18.6961561Z         pnpm exec playwright show-trace test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium/trace.zip
2026-05-17T01:02:18.6962288Z 
2026-05-17T01:02:18.6962818Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6963404Z 
2026-05-17T01:02:18.6963918Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6964343Z 
2026-05-17T01:02:18.6964932Z     Error: [2mexpect([22m[31mreceived[39m[2m).[22mtoBeGreaterThan[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.6965474Z 
2026-05-17T01:02:18.6965689Z     Expected: > [32m470[39m
2026-05-17T01:02:18.6966088Z     Received:   [31m440[39m
2026-05-17T01:02:18.6966348Z 
2026-05-17T01:02:18.6966586Z       78 |       .getAttribute('data-x-coord');
2026-05-17T01:02:18.6967085Z       79 |     const afterX = Number(afterXStr ?? '0');
2026-05-17T01:02:18.6967869Z     > 80 |     expect(afterX).toBeGreaterThan(beforeX + 30); // ≥30 px movement; conservative.
2026-05-17T01:02:18.6968484Z          |                    ^
2026-05-17T01:02:18.6968830Z       81 |
2026-05-17T01:02:18.6969461Z       82 |     // (4) Chat round-trip. A presses Enter to focus chat, types, Enter to send.
2026-05-17T01:02:18.6970202Z       83 |     //     B sees a `.chat-line` matching `<sender>: <text>` within 5s.
2026-05-17T01:02:18.6970950Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08.e2e.test.ts:80:20
2026-05-17T01:02:18.6971425Z 
2026-05-17T01:02:18.6972066Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6973114Z     test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.6974220Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6974645Z 
2026-05-17T01:02:18.6975194Z     attachment #2: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6976218Z     test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium-retry1/test-failed-2.png
2026-05-17T01:02:18.6977515Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6977961Z 
2026-05-17T01:02:18.6978640Z     Error Context: test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium-retry1/error-context.md
2026-05-17T01:02:18.6979489Z 
2026-05-17T01:02:18.6980062Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.6981046Z     test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium-retry1/trace.zip
2026-05-17T01:02:18.6981761Z     Usage:
2026-05-17T01:02:18.6981958Z 
2026-05-17T01:02:18.6982694Z         pnpm exec playwright show-trace test-results/cli-08.e2e-CLI-08-hard-mil-38a87--round-trip-reconnect-grace-chromium-retry1/trace.zip
2026-05-17T01:02:18.6983465Z 
2026-05-17T01:02:18.6983978Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.6984421Z 
2026-05-17T01:02:18.6985231Z   9) [chromium] › test/e2e/logout.e2e.test.ts:18:3 › Esc menu › Esc opens menu; Logout returns to LoginScene with cleared session cookies (D-34) 
2026-05-17T01:02:18.6986079Z 
2026-05-17T01:02:18.6986585Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:18.6987056Z 
2026-05-17T01:02:18.6987365Z     Locator: locator('form#login-form, #login-form, #username')
2026-05-17T01:02:18.6987848Z     Expected: visible
2026-05-17T01:02:18.6988534Z     Error: strict mode violation: locator('form#login-form, #login-form, #username') resolved to 2 elements:
2026-05-17T01:02:18.6989705Z         1) <form id="login-form">…</form> aka getByText('Log in to BN Online Username')
2026-05-17T01:02:18.6990817Z         2) <input type="text" required="" id="username" maxlength="64" name="username" autocomplete="username"/> aka getByRole('textbox', { name: 'Username' })
2026-05-17T01:02:18.6991575Z 
2026-05-17T01:02:18.6991738Z     Call log:
2026-05-17T01:02:18.6992212Z     [2m  - Expect "toBeVisible" with timeout 5000ms[22m
2026-05-17T01:02:18.6992955Z     [2m  - waiting for locator('form#login-form, #login-form, #username')[22m
2026-05-17T01:02:18.6993381Z 
2026-05-17T01:02:18.6993453Z 
2026-05-17T01:02:18.6993616Z       36 |
2026-05-17T01:02:18.6994097Z       37 |     // Should navigate back to LoginScene (login form heading visible)
2026-05-17T01:02:18.6994908Z     > 38 |     await expect(page.locator('form#login-form, #login-form, #username')).toBeVisible({
2026-05-17T01:02:18.6995627Z          |                                                                           ^
2026-05-17T01:02:18.6996112Z       39 |       timeout: 5_000,
2026-05-17T01:02:18.6996469Z       40 |     });
2026-05-17T01:02:18.6996775Z       41 |
2026-05-17T01:02:18.6997315Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/logout.e2e.test.ts:38:75
2026-05-17T01:02:18.6997783Z 
2026-05-17T01:02:18.6998499Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.6999634Z     test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium/test-failed-1.png
2026-05-17T01:02:18.7000713Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7001139Z 
2026-05-17T01:02:18.7001688Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7002706Z     test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium/video.webm
2026-05-17T01:02:18.7003740Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7004165Z 
2026-05-17T01:02:18.7004813Z     Error Context: test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium/error-context.md
2026-05-17T01:02:18.7005499Z 
2026-05-17T01:02:18.7006083Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.7007035Z     test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium/trace.zip
2026-05-17T01:02:18.7007884Z     Usage:
2026-05-17T01:02:18.7008081Z 
2026-05-17T01:02:18.7008796Z         pnpm exec playwright show-trace test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium/trace.zip
2026-05-17T01:02:18.7009664Z 
2026-05-17T01:02:18.7010180Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7010606Z 
2026-05-17T01:02:18.7011115Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7011547Z 
2026-05-17T01:02:18.7012051Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:18.7012520Z 
2026-05-17T01:02:18.7012829Z     Locator: locator('form#login-form, #login-form, #username')
2026-05-17T01:02:18.7013327Z     Expected: visible
2026-05-17T01:02:18.7014007Z     Error: strict mode violation: locator('form#login-form, #login-form, #username') resolved to 2 elements:
2026-05-17T01:02:18.7014990Z         1) <form id="login-form">…</form> aka getByText('Log in to BN Online Username')
2026-05-17T01:02:18.7016092Z         2) <input type="text" required="" id="username" maxlength="64" name="username" autocomplete="username"/> aka getByRole('textbox', { name: 'Username' })
2026-05-17T01:02:18.7016852Z 
2026-05-17T01:02:18.7017015Z     Call log:
2026-05-17T01:02:18.7017485Z     [2m  - Expect "toBeVisible" with timeout 5000ms[22m
2026-05-17T01:02:18.7018190Z     [2m  - waiting for locator('form#login-form, #login-form, #username')[22m
2026-05-17T01:02:18.7018623Z 
2026-05-17T01:02:18.7018696Z 
2026-05-17T01:02:18.7018856Z       36 |
2026-05-17T01:02:18.7019442Z       37 |     // Should navigate back to LoginScene (login form heading visible)
2026-05-17T01:02:18.7020407Z     > 38 |     await expect(page.locator('form#login-form, #login-form, #username')).toBeVisible({
2026-05-17T01:02:18.7021124Z          |                                                                           ^
2026-05-17T01:02:18.7021610Z       39 |       timeout: 5_000,
2026-05-17T01:02:18.7021966Z       40 |     });
2026-05-17T01:02:18.7022277Z       41 |
2026-05-17T01:02:18.7022800Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/logout.e2e.test.ts:38:75
2026-05-17T01:02:18.7023264Z 
2026-05-17T01:02:18.7023854Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.7024916Z     test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium-retry1/test-failed-1.png
2026-05-17T01:02:18.7026047Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7026467Z 
2026-05-17T01:02:18.7027014Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7028018Z     test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium-retry1/video.webm
2026-05-17T01:02:18.7029223Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7029658Z 
2026-05-17T01:02:18.7030359Z     Error Context: test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium-retry1/error-context.md
2026-05-17T01:02:18.7031094Z 
2026-05-17T01:02:18.7031737Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.7032744Z     test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium-retry1/trace.zip
2026-05-17T01:02:18.7033475Z     Usage:
2026-05-17T01:02:18.7033666Z 
2026-05-17T01:02:18.7034425Z         pnpm exec playwright show-trace test-results/logout.e2e-Esc-menu-Esc-op-3ce00-eared-session-cookies-D-34--chromium-retry1/trace.zip
2026-05-17T01:02:18.7035239Z 
2026-05-17T01:02:18.7035746Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7036327Z 
2026-05-17T01:02:18.7037411Z   10) [chromium] › test/e2e/sprite-state.e2e.test.ts:16:3 › sprite-state machine (D-35) + nametag (D-27a) › player sprite frame switches to Run<R> on rightward movement, back to Stand on stop 
2026-05-17T01:02:18.7038305Z 
2026-05-17T01:02:18.7038854Z     Error: [2mexpect([22m[31mreceived[39m[2m).[22mtoMatch[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.7039471Z 
2026-05-17T01:02:18.7039798Z     Expected pattern: [32m/^0028-NaviRunR_\d{3}$/[39m
2026-05-17T01:02:18.7040412Z     Received string:  [31m"0000-NaviStandD_000"[39m
2026-05-17T01:02:18.7040749Z 
2026-05-17T01:02:18.7040914Z       32 |
2026-05-17T01:02:18.7041351Z       33 |     // Frame key must match Run R pattern: '0028-NaviRunR_NNN'
2026-05-17T01:02:18.7041995Z     > 34 |     expect(frameWhileRunning).toMatch(/^0028-NaviRunR_\d{3}$/);
2026-05-17T01:02:18.7042688Z          |                               ^
2026-05-17T01:02:18.7043072Z       35 |
2026-05-17T01:02:18.7043443Z       36 |     // Release right arrow and wait for stop
2026-05-17T01:02:18.7043951Z       37 |     await page.keyboard.up('ArrowRight');
2026-05-17T01:02:18.7044652Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/sprite-state.e2e.test.ts:34:31
2026-05-17T01:02:18.7045159Z 
2026-05-17T01:02:18.7045729Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:18.7046741Z     test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium/test-failed-1.png
2026-05-17T01:02:18.7047818Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7048242Z 
2026-05-17T01:02:18.7048795Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7049877Z     test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium/video.webm
2026-05-17T01:02:18.7050948Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7051379Z 
2026-05-17T01:02:18.7052033Z     Error Context: test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium/error-context.md
2026-05-17T01:02:18.7052739Z 
2026-05-17T01:02:18.7053304Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:18.7054263Z     test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium/trace.zip
2026-05-17T01:02:18.7054951Z     Usage:
2026-05-17T01:02:18.7055153Z 
2026-05-17T01:02:18.7055881Z         pnpm exec playwright show-trace test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium/trace.zip
2026-05-17T01:02:18.7056631Z 
2026-05-17T01:02:18.7057147Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7057587Z 
2026-05-17T01:02:18.7058241Z     Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:18.7058620Z 
2026-05-17T01:02:18.7059248Z     Error: [2mexpect([22m[31mreceived[39m[2m).[22mtoMatch[2m([22m[32mexpected[39m[2m)[22m
2026-05-17T01:02:18.7059714Z 
2026-05-17T01:02:18.7060064Z     Expected pattern: [32m/^0028-NaviRunR_\d{3}$/[39m
2026-05-17T01:02:18.7060807Z     Received string:  [31m"0000-NaviStandD_000"[39m
2026-05-17T01:02:18.7061167Z 
2026-05-17T01:02:18.7061333Z       32 |
2026-05-17T01:02:18.7061788Z       33 |     // Frame key must match Run R pattern: '0028-NaviRunR_NNN'
2026-05-17T01:02:18.7062445Z     > 34 |     expect(frameWhileRunning).toMatch(/^0028-NaviRunR_\d{3}$/);
2026-05-17T01:02:18.7062983Z          |                               ^
2026-05-17T01:02:18.7063354Z       35 |
2026-05-17T01:02:18.7064011Z       36 |     // Release right arrow and wait for stop
2026-05-17T01:02:18.7064596Z       37 |     await page.keyboard.up('ArrowRight');
2026-05-17T01:02:18.7065421Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/sprite-state.e2e.test.ts:34:31
2026-05-17T01:02:18.7065963Z 
2026-05-17T01:02:18.7066542Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.1890544Z     test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium-retry1/test-failed-1.png
2026-05-17T01:02:19.1929961Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.1989203Z 
2026-05-17T01:02:19.1995005Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2015630Z     test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium-retry1/video.webm
2026-05-17T01:02:19.2016839Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2017610Z 
2026-05-17T01:02:19.2018595Z     Error Context: test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium-retry1/error-context.md
2026-05-17T01:02:19.2019437Z 
2026-05-17T01:02:19.2019990Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:19.2020920Z     test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium-retry1/trace.zip
2026-05-17T01:02:19.2021591Z     Usage:
2026-05-17T01:02:19.2021780Z 
2026-05-17T01:02:19.2022466Z         pnpm exec playwright show-trace test-results/sprite-state.e2e-sprite-st-8eb1f-ement-back-to-Stand-on-stop-chromium-retry1/trace.zip
2026-05-17T01:02:19.2023189Z 
2026-05-17T01:02:19.2023649Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2024033Z 
2026-05-17T01:02:19.2024724Z   11) [chromium] › test/e2e/cli-08-collision-boundary.spec.ts:132:3 › derived collision_polys block north wall (D-62 anti-revert) 
2026-05-17T01:02:19.2025339Z 
2026-05-17T01:02:19.2025812Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:19.2026229Z 
2026-05-17T01:02:19.2026482Z     Locator: locator('canvas[data-game-ready="true"]')
2026-05-17T01:02:19.2026888Z     Expected: visible
2026-05-17T01:02:19.2027194Z     Timeout: 15000ms
2026-05-17T01:02:19.2027523Z     Error: element(s) not found
2026-05-17T01:02:19.2027772Z 
2026-05-17T01:02:19.2027931Z     Call log:
2026-05-17T01:02:19.2028366Z     [2m  - Expect "toBeVisible" with timeout 15000ms[22m
2026-05-17T01:02:19.2029093Z     [2m  - waiting for locator('canvas[data-game-ready="true"]')[22m
2026-05-17T01:02:19.2029518Z 
2026-05-17T01:02:19.2029596Z 
2026-05-17T01:02:19.2029792Z        at fixtures.ts:172
2026-05-17T01:02:19.2030053Z 
2026-05-17T01:02:19.2030232Z       170 |  */
2026-05-17T01:02:19.2030975Z       171 | export async function waitForGameReady(page: Page): Promise<void> {
2026-05-17T01:02:19.2031794Z     > 172 |   await expect(page.locator('canvas[data-game-ready="true"]')).toBeVisible({
2026-05-17T01:02:19.2032523Z           |                                                                ^
2026-05-17T01:02:19.2033023Z       173 |     timeout: 15_000,
2026-05-17T01:02:19.2033407Z       174 |   });
2026-05-17T01:02:19.2033734Z       175 | }
2026-05-17T01:02:19.2034376Z         at waitForGameReady (/home/runner/work/rebno/rebno/apps/client/test/e2e/fixtures.ts:172:64)
2026-05-17T01:02:19.2035557Z         at loginAndAssertTiles (/home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-collision-boundary.spec.ts:38:9)
2026-05-17T01:02:19.2036705Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-collision-boundary.spec.ts:137:5
2026-05-17T01:02:19.2037286Z 
2026-05-17T01:02:19.2037904Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2038972Z     test-results/cli-08-collision-boundary--88271-orth-wall-D-62-anti-revert--chromium/test-failed-1.png
2026-05-17T01:02:19.2040355Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2040813Z 
2026-05-17T01:02:19.2041404Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2042407Z     test-results/cli-08-collision-boundary--88271-orth-wall-D-62-anti-revert--chromium/video.webm
2026-05-17T01:02:19.2043696Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2044149Z 
2026-05-17T01:02:19.2044832Z     Error Context: test-results/cli-08-collision-boundary--88271-orth-wall-D-62-anti-revert--chromium/error-context.md
2026-05-17T01:02:19.2045578Z 
2026-05-17T01:02:19.2046171Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:19.2047202Z     test-results/cli-08-collision-boundary--88271-orth-wall-D-62-anti-revert--chromium/trace.zip
2026-05-17T01:02:19.2048114Z     Usage:
2026-05-17T01:02:19.2048322Z 
2026-05-17T01:02:19.2049201Z         pnpm exec playwright show-trace test-results/cli-08-collision-boundary--88271-orth-wall-D-62-anti-revert--chromium/trace.zip
2026-05-17T01:02:19.2049972Z 
2026-05-17T01:02:19.2050488Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2050926Z 
2026-05-17T01:02:19.2051793Z   12) [chromium] › test/e2e/cli-08-direction-convergence.spec.ts:70:1 › CLI-08 D-58c — dual-tab direction convergence (REQ-SRV-03 server-authoritative) 
2026-05-17T01:02:19.2052573Z 
2026-05-17T01:02:19.2053093Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:19.2053597Z 
2026-05-17T01:02:19.2053878Z     Locator: locator('canvas[data-game-ready="true"]')
2026-05-17T01:02:19.2054527Z     Expected: visible
2026-05-17T01:02:19.2054883Z     Timeout: 15000ms
2026-05-17T01:02:19.2055267Z     Error: element(s) not found
2026-05-17T01:02:19.2055568Z 
2026-05-17T01:02:19.2055735Z     Call log:
2026-05-17T01:02:19.2056242Z     [2m  - Expect "toBeVisible" with timeout 15000ms[22m
2026-05-17T01:02:19.2056944Z     [2m  - waiting for locator('canvas[data-game-ready="true"]')[22m
2026-05-17T01:02:19.2057361Z 
2026-05-17T01:02:19.2057445Z 
2026-05-17T01:02:19.2057630Z        at fixtures.ts:172
2026-05-17T01:02:19.2057885Z 
2026-05-17T01:02:19.2058046Z       170 |  */
2026-05-17T01:02:19.2058581Z       171 | export async function waitForGameReady(page: Page): Promise<void> {
2026-05-17T01:02:19.2059601Z     > 172 |   await expect(page.locator('canvas[data-game-ready="true"]')).toBeVisible({
2026-05-17T01:02:19.2060301Z           |                                                                ^
2026-05-17T01:02:19.2060790Z       173 |     timeout: 15_000,
2026-05-17T01:02:19.2061181Z       174 |   });
2026-05-17T01:02:19.2061506Z       175 | }
2026-05-17T01:02:19.2062141Z         at waitForGameReady (/home/runner/work/rebno/rebno/apps/client/test/e2e/fixtures.ts:172:64)
2026-05-17T01:02:19.2063187Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-direction-convergence.spec.ts:95:11
2026-05-17T01:02:19.2063788Z 
2026-05-17T01:02:19.2064396Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2065470Z     test-results/cli-08-direction-convergen-cbd92-RV-03-server-authoritative--chromium/test-failed-1.png
2026-05-17T01:02:19.2066617Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2067066Z 
2026-05-17T01:02:19.2067656Z     attachment #2: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2068710Z     test-results/cli-08-direction-convergen-cbd92-RV-03-server-authoritative--chromium/test-failed-2.png
2026-05-17T01:02:19.2069865Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2070435Z 
2026-05-17T01:02:19.2071067Z     Error Context: test-results/cli-08-direction-convergen-cbd92-RV-03-server-authoritative--chromium/error-context.md
2026-05-17T01:02:19.2071797Z 
2026-05-17T01:02:19.2072391Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:19.2073361Z     test-results/cli-08-direction-convergen-cbd92-RV-03-server-authoritative--chromium/trace.zip
2026-05-17T01:02:19.2074061Z     Usage:
2026-05-17T01:02:19.2074270Z 
2026-05-17T01:02:19.2074978Z         pnpm exec playwright show-trace test-results/cli-08-direction-convergen-cbd92-RV-03-server-authoritative--chromium/trace.zip
2026-05-17T01:02:19.2075724Z 
2026-05-17T01:02:19.2076343Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2076912Z 
2026-05-17T01:02:19.2077562Z   13) [chromium] › test/e2e/cli-08-floor-collision.e2e.test.ts:114:3 › floor tiles render and block east wall 
2026-05-17T01:02:19.2078183Z 
2026-05-17T01:02:19.2078698Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:19.2079401Z 
2026-05-17T01:02:19.2079682Z     Locator: locator('canvas[data-game-ready="true"]')
2026-05-17T01:02:19.2080135Z     Expected: visible
2026-05-17T01:02:19.2080479Z     Timeout: 15000ms
2026-05-17T01:02:19.2080842Z     Error: element(s) not found
2026-05-17T01:02:19.2081119Z 
2026-05-17T01:02:19.2081294Z     Call log:
2026-05-17T01:02:19.2081787Z     [2m  - Expect "toBeVisible" with timeout 15000ms[22m
2026-05-17T01:02:19.2082421Z     [2m  - waiting for locator('canvas[data-game-ready="true"]')[22m
2026-05-17T01:02:19.2082810Z 
2026-05-17T01:02:19.2082883Z 
2026-05-17T01:02:19.2083053Z        at fixtures.ts:172
2026-05-17T01:02:19.2083304Z 
2026-05-17T01:02:19.2083471Z       170 |  */
2026-05-17T01:02:19.2083985Z       171 | export async function waitForGameReady(page: Page): Promise<void> {
2026-05-17T01:02:19.2084741Z     > 172 |   await expect(page.locator('canvas[data-game-ready="true"]')).toBeVisible({
2026-05-17T01:02:19.2085413Z           |                                                                ^
2026-05-17T01:02:19.2085896Z       173 |     timeout: 15_000,
2026-05-17T01:02:19.2086267Z       174 |   });
2026-05-17T01:02:19.2086580Z       175 | }
2026-05-17T01:02:19.2087180Z         at waitForGameReady (/home/runner/work/rebno/rebno/apps/client/test/e2e/fixtures.ts:172:64)
2026-05-17T01:02:19.2088230Z         at loginAndAssertTiles (/home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-floor-collision.e2e.test.ts:24:9)
2026-05-17T01:02:19.2089404Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-floor-collision.e2e.test.ts:119:5
2026-05-17T01:02:19.2090168Z 
2026-05-17T01:02:19.2090817Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2094095Z     test-results/cli-08-floor-collision.e2e-e24e8--render-and-block-east-wall-chromium/test-failed-1.png
2026-05-17T01:02:19.2095803Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2096325Z 
2026-05-17T01:02:19.2096950Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2098009Z     test-results/cli-08-floor-collision.e2e-e24e8--render-and-block-east-wall-chromium/video.webm
2026-05-17T01:02:19.2099401Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2099921Z 
2026-05-17T01:02:19.2100627Z     Error Context: test-results/cli-08-floor-collision.e2e-e24e8--render-and-block-east-wall-chromium/error-context.md
2026-05-17T01:02:19.2101410Z 
2026-05-17T01:02:19.2102056Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:19.2103137Z     test-results/cli-08-floor-collision.e2e-e24e8--render-and-block-east-wall-chromium/trace.zip
2026-05-17T01:02:19.2103928Z     Usage:
2026-05-17T01:02:19.2104172Z 
2026-05-17T01:02:19.2104922Z         pnpm exec playwright show-trace test-results/cli-08-floor-collision.e2e-e24e8--render-and-block-east-wall-chromium/trace.zip
2026-05-17T01:02:19.2105713Z 
2026-05-17T01:02:19.2106337Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2106834Z 
2026-05-17T01:02:19.2107682Z   14) [chromium] › test/e2e/cli-08-ghost-run-disconnect.spec.ts:21:1 › disconnect while moving: observer does not see stale remote cardinal run 
2026-05-17T01:02:19.2108425Z 
2026-05-17T01:02:19.2108898Z     Error: remote should be removed from observer state after reconnect grace expires
2026-05-17T01:02:19.2109861Z 
2026-05-17T01:02:19.2110557Z     [2mexpect([22m[31mreceived[39m[2m).[22mtoBe[2m([22m[32mexpected[39m[2m) // Object.is equality[22m
2026-05-17T01:02:19.2111367Z 
2026-05-17T01:02:19.2111645Z     Expected: [32mtrue[39m
2026-05-17T01:02:19.2112125Z     Received: [31mfalse[39m
2026-05-17T01:02:19.2112427Z 
2026-05-17T01:02:19.2112718Z       67 |       tail.every((s) => s.x === null),
2026-05-17T01:02:19.2113448Z       68 |       'remote should be removed from observer state after reconnect grace expires',
2026-05-17T01:02:19.2114080Z     > 69 |     ).toBe(true);
2026-05-17T01:02:19.2114477Z          |       ^
2026-05-17T01:02:19.2114853Z       70 |   } finally {
2026-05-17T01:02:19.2115419Z       71 |     await ctxA.close().catch(() => {});
2026-05-17T01:02:19.2115923Z       72 |     await ctxB.close();
2026-05-17T01:02:19.2116704Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/cli-08-ghost-run-disconnect.spec.ts:69:7
2026-05-17T01:02:19.2117323Z 
2026-05-17T01:02:19.2117956Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2119285Z     test-results/cli-08-ghost-run-disconnec-26509-e-stale-remote-cardinal-run-chromium/test-failed-1.png
2026-05-17T01:02:19.2120767Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2121420Z 
2026-05-17T01:02:19.2122004Z     attachment #2: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2123004Z     test-results/cli-08-ghost-run-disconnec-26509-e-stale-remote-cardinal-run-chromium/test-failed-2.png
2026-05-17T01:02:19.2124205Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2124698Z 
2026-05-17T01:02:19.2125415Z     Error Context: test-results/cli-08-ghost-run-disconnec-26509-e-stale-remote-cardinal-run-chromium/error-context.md
2026-05-17T01:02:19.2126200Z 
2026-05-17T01:02:19.2126830Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:19.2127878Z     test-results/cli-08-ghost-run-disconnec-26509-e-stale-remote-cardinal-run-chromium/trace.zip
2026-05-17T01:02:19.2128622Z     Usage:
2026-05-17T01:02:19.2128875Z 
2026-05-17T01:02:19.2129846Z         pnpm exec playwright show-trace test-results/cli-08-ghost-run-disconnec-26509-e-stale-remote-cardinal-run-chromium/trace.zip
2026-05-17T01:02:19.2130720Z 
2026-05-17T01:02:19.2131282Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2131749Z 
2026-05-17T01:02:19.2132525Z   15) [chromium] › test/e2e/logout.e2e.test.ts:69:3 › Esc menu › Resume closes menu and re-engages movement without navigating 
2026-05-17T01:02:19.2133255Z 
2026-05-17T01:02:19.2133838Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:19.2134360Z 
2026-05-17T01:02:19.2134688Z     Locator: locator('canvas[data-game-ready="true"]')
2026-05-17T01:02:19.2135188Z     Expected: visible
2026-05-17T01:02:19.2135781Z     Timeout: 15000ms
2026-05-17T01:02:19.2136207Z     Error: element(s) not found
2026-05-17T01:02:19.2136545Z 
2026-05-17T01:02:19.2136764Z     Call log:
2026-05-17T01:02:19.2137303Z     [2m  - Expect "toBeVisible" with timeout 15000ms[22m
2026-05-17T01:02:19.2138019Z     [2m  - waiting for locator('canvas[data-game-ready="true"]')[22m
2026-05-17T01:02:19.2138473Z 
2026-05-17T01:02:19.2138586Z 
2026-05-17T01:02:19.2138816Z        at fixtures.ts:172
2026-05-17T01:02:19.2139363Z 
2026-05-17T01:02:19.2139577Z       170 |  */
2026-05-17T01:02:19.2140163Z       171 | export async function waitForGameReady(page: Page): Promise<void> {
2026-05-17T01:02:19.2141010Z     > 172 |   await expect(page.locator('canvas[data-game-ready="true"]')).toBeVisible({
2026-05-17T01:02:19.2141754Z           |                                                                ^
2026-05-17T01:02:19.2142274Z       173 |     timeout: 15_000,
2026-05-17T01:02:19.2142677Z       174 |   });
2026-05-17T01:02:19.2143038Z       175 | }
2026-05-17T01:02:19.2143751Z         at waitForGameReady (/home/runner/work/rebno/rebno/apps/client/test/e2e/fixtures.ts:172:64)
2026-05-17T01:02:19.2144844Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/logout.e2e.test.ts:75:11
2026-05-17T01:02:19.2145380Z 
2026-05-17T01:02:19.2145984Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2147083Z     test-results/logout.e2e-Esc-menu-Resume-2fb09-movement-without-navigating-chromium/test-failed-1.png
2026-05-17T01:02:19.2148267Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2148735Z 
2026-05-17T01:02:19.2149544Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2150579Z     test-results/logout.e2e-Esc-menu-Resume-2fb09-movement-without-navigating-chromium/video.webm
2026-05-17T01:02:19.2151667Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2152784Z 
2026-05-17T01:02:19.2153594Z     Error Context: test-results/logout.e2e-Esc-menu-Resume-2fb09-movement-without-navigating-chromium/error-context.md
2026-05-17T01:02:19.2154407Z 
2026-05-17T01:02:19.2155087Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:19.2159557Z     test-results/logout.e2e-Esc-menu-Resume-2fb09-movement-without-navigating-chromium/trace.zip
2026-05-17T01:02:19.2160269Z     Usage:
2026-05-17T01:02:19.2160409Z 
2026-05-17T01:02:19.2161074Z         pnpm exec playwright show-trace test-results/logout.e2e-Esc-menu-Resume-2fb09-movement-without-navigating-chromium/trace.zip
2026-05-17T01:02:19.2161744Z 
2026-05-17T01:02:19.2162224Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2162561Z 
2026-05-17T01:02:19.2163421Z   16) [chromium] › test/e2e/sprite-state.e2e.test.ts:48:3 › sprite-state machine (D-35) + nametag (D-27a) › nameplate DOM mirror is visible for self (count >= 1) 
2026-05-17T01:02:19.2164309Z 
2026-05-17T01:02:19.2165778Z     Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
2026-05-17T01:02:19.2166097Z 
2026-05-17T01:02:19.2166252Z     Locator: locator('canvas[data-game-ready="true"]')
2026-05-17T01:02:19.2166513Z     Expected: visible
2026-05-17T01:02:19.2166693Z     Timeout: 15000ms
2026-05-17T01:02:19.2166887Z     Error: element(s) not found
2026-05-17T01:02:19.2167014Z 
2026-05-17T01:02:19.2167085Z     Call log:
2026-05-17T01:02:19.2167394Z     [2m  - Expect "toBeVisible" with timeout 15000ms[22m
2026-05-17T01:02:19.2167793Z     [2m  - waiting for locator('canvas[data-game-ready="true"]')[22m
2026-05-17T01:02:19.2168070Z 
2026-05-17T01:02:19.2168077Z 
2026-05-17T01:02:19.2168193Z        at fixtures.ts:172
2026-05-17T01:02:19.2168364Z 
2026-05-17T01:02:19.2168465Z       170 |  */
2026-05-17T01:02:19.2169189Z       171 | export async function waitForGameReady(page: Page): Promise<void> {
2026-05-17T01:02:19.2170352Z     > 172 |   await expect(page.locator('canvas[data-game-ready="true"]')).toBeVisible({
2026-05-17T01:02:19.2170964Z           |                                                                ^
2026-05-17T01:02:19.2171375Z       173 |     timeout: 15_000,
2026-05-17T01:02:19.2171648Z       174 |   });
2026-05-17T01:02:19.2171880Z       175 | }
2026-05-17T01:02:19.2172433Z         at waitForGameReady (/home/runner/work/rebno/rebno/apps/client/test/e2e/fixtures.ts:172:64)
2026-05-17T01:02:19.2173269Z         at /home/runner/work/rebno/rebno/apps/client/test/e2e/sprite-state.e2e.test.ts:54:11
2026-05-17T01:02:19.2173697Z 
2026-05-17T01:02:19.2174429Z     attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
2026-05-17T01:02:19.2175381Z     test-results/sprite-state.e2e-sprite-st-e6b4e-s-visible-for-self-count-1--chromium/test-failed-1.png
2026-05-17T01:02:19.2176173Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2176561Z 
2026-05-17T01:02:19.2177023Z     attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2177571Z     test-results/sprite-state.e2e-sprite-st-e6b4e-s-visible-for-self-count-1--chromium/video.webm
2026-05-17T01:02:19.2178165Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2178376Z 
2026-05-17T01:02:19.2178725Z     Error Context: test-results/sprite-state.e2e-sprite-st-e6b4e-s-visible-for-self-count-1--chromium/error-context.md
2026-05-17T01:02:19.2179319Z 
2026-05-17T01:02:19.2179625Z     attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
2026-05-17T01:02:19.2180184Z     test-results/sprite-state.e2e-sprite-st-e6b4e-s-visible-for-self-count-1--chromium/trace.zip
2026-05-17T01:02:19.2180729Z     Usage:
2026-05-17T01:02:19.2180817Z 
2026-05-17T01:02:19.2181210Z         pnpm exec playwright show-trace test-results/sprite-state.e2e-sprite-st-e6b4e-s-visible-for-self-count-1--chromium/trace.zip
2026-05-17T01:02:19.2181641Z 
2026-05-17T01:02:19.2181914Z     ────────────────────────────────────────────────────────────────────────────────────────────────
2026-05-17T01:02:19.2182133Z 
2026-05-17T01:02:19.2182199Z   10 failed
2026-05-17T01:02:19.2182717Z     [chromium] › test/e2e/camera-follow.e2e.test.ts:18:1 › Camera follow: walking toward room edge pans the camera (D-29 mandatory) 
2026-05-17T01:02:19.2183576Z     [chromium] › test/e2e/cli-08-anim.e2e.test.ts:32:1 › CLI-08 anim — local sprite advances ≥3 distinct frames during 1s KeyD hold (Wave 4 GREEN gate) 
2026-05-17T01:02:19.2184417Z     [chromium] › test/e2e/cli-08-camera.e2e.test.ts:29:1 › CLI-08 camera follow — pressing KeyD for 300ms pans camera scrollX (Wave 4 GREEN gate) 
2026-05-17T01:02:19.2185232Z     [chromium] › test/e2e/cli-08-local-anim.e2e.test.ts:25:1 › local sprite cycles frames during held-key input (D-41 anti-recurrence gate) 
2026-05-17T01:02:19.2186240Z     [chromium] › test/e2e/cli-08-resume-render.spec.ts:30:1 › cli-08-resume-render — CLI-08 resume render — Cookie auto-login: login → reload → GameScene re-renders within 5s + chat works 
2026-05-17T01:02:19.2187323Z     [chromium] › test/e2e/cli-08-snapshot-no-spawn-anim.spec.ts:138:1 › CLI-08 D-55d — A joined first: A DOES see TeleIn anim when B joins during session (gating preserves new-join semantics) 
2026-05-17T01:02:19.2188256Z     [chromium] › test/e2e/cli-08-tiles.e2e.test.ts:26:1 › CLI-08 tiles — RoomRenderer emits floor tiles + TSide1 sides (Wave 4 GREEN gate) 
2026-05-17T01:02:19.2189143Z     [chromium] › test/e2e/cli-08.e2e.test.ts:22:1 › CLI-08 hard milestone — two clients see each other move + chat round-trip + reconnect grace 
2026-05-17T01:02:19.2189947Z     [chromium] › test/e2e/logout.e2e.test.ts:18:3 › Esc menu › Esc opens menu; Logout returns to LoginScene with cleared session cookies (D-34) 
2026-05-17T01:02:19.2190938Z     [chromium] › test/e2e/sprite-state.e2e.test.ts:16:3 › sprite-state machine (D-35) + nametag (D-27a) › player sprite frame switches to Run<R> on rightward movement, back to Stand on stop 
2026-05-17T01:02:19.2191606Z   6 flaky
2026-05-17T01:02:19.2192104Z     [chromium] › test/e2e/cli-08-collision-boundary.spec.ts:132:3 › derived collision_polys block north wall (D-62 anti-revert) 
2026-05-17T01:02:19.2192963Z     [chromium] › test/e2e/cli-08-direction-convergence.spec.ts:70:1 › CLI-08 D-58c — dual-tab direction convergence (REQ-SRV-03 server-authoritative) 
2026-05-17T01:02:19.2193723Z     [chromium] › test/e2e/cli-08-floor-collision.e2e.test.ts:114:3 › floor tiles render and block east wall 
2026-05-17T01:02:19.2194474Z     [chromium] › test/e2e/cli-08-ghost-run-disconnect.spec.ts:21:1 › disconnect while moving: observer does not see stale remote cardinal run 
2026-05-17T01:02:19.2195254Z     [chromium] › test/e2e/logout.e2e.test.ts:69:3 › Esc menu › Resume closes menu and re-engages movement without navigating 
2026-05-17T01:02:19.2196099Z     [chromium] › test/e2e/sprite-state.e2e.test.ts:48:3 › sprite-state machine (D-35) + nametag (D-27a) › nameplate DOM mirror is visible for self (count >= 1) 
2026-05-17T01:02:19.2196596Z   23 passed (11.1m)
2026-05-17T01:02:19.2595054Z /home/runner/work/rebno/rebno/apps/client:
2026-05-17T01:02:19.2596260Z  ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL  @rebno/client@0.1.0 test:e2e: `playwright test`
2026-05-17T01:02:19.2597108Z Exit status 1
2026-05-17T01:02:19.2780766Z ##[error]Process completed with exit code 1.
